<?php
/**
 * widget支持 - JBlog
 * 
 * @copyright (c) 2008-2010 JBlog (www.lisijie.org)
 * @author lisijie <lisijie86@gmail.com>
 * @version $Id: class_widget.php 551 2010-07-22 09:35:52Z lisijie86 $
*/

class Widget {
	
	var $options;
	var $id;
	var $db;
	var $cache;
	
	function Widget($options = array()) {
		$this->__construct($options);
	}
	
	function __construct($options = array()) {
		$this->db = & $GLOBALS['db'];
		$this->cache = & $GLOBALS['cache'];
		$this->id = strtolower(substr(get_class($this), 0, -6));
		$this->get_setting();
		$this->options = array_merge($options,$this->options);
	}
	
	/**
	 * 后台的widget设置界面
	 * 仅在widget需要配置时才重写该方法
	 */
	function setting() {
		echo('<p>'.__('该widget没有设置选项').'</p>');
	}
	
	/**
	 * 加载配置信息，由基类调用
	 */
	function get_setting() {
		global $_CACHE;
		$setting = $_CACHE['widget']['widget_'.$this->id];
		if ( $setting ) {
			$this->options = (array)$setting;
		} else {
			$this->options = array();
		}
	}
	
	/**
	 * 保存Widget配置信息
	 *
	 * @param array $updata 包含配置项的关联数组
	 * @return void
	 */
	function set_setting($updata) {
		$updata = del_slashes($updata);
		$updata = addslashes(serialize($updata));
		$data = array(
			'name' => 'widget_'.$this->id,
			'value' => $updata,
			'type' => 'widget'
		);
		$this->db->insert('config', $data, true);
		recache('widget');
	}
	
	/**
	 * 获取一个配置项的值
	 *
	 * @param string $key 配置项
	 * @return string 值
	 */
	function get_option($key) {
		return $this->options[$key];
	}
	
	/**
	 * 处理Widget设置信息
	 * widget点击保存设置后，系统将提交的数据交给Widget进行过滤处理
	 * 处理完成后必须返回数组，接下来系统将调用 set_setting() 方法保存配置信息。
	 */
	function update($updata) {
		return $updata;
	}
	
	//前台显示，必须重写该方法
	function display() {
		die('function Widget::display() must be over-ridden in a sub-class.');
	}
	
	//工厂方法
	function factory($widget) {
		static $instance = array();
		if ( preg_match('/^[a-z_]+$/i', $widget) ) {
			if ( !isset($instance[$widget]) ) {
				$classname = ucfirst($widget).'Widget';
				if ( class_exists($classname) ) {
					$instance[$widget] = new $classname();
					if ( is_subclass_of($instance[$widget], 'Widget') ) {
						return $instance[$widget];
					} else {
						unset($instance[$widget]);
					}
				}
			}
			return $instance[$widget];
		}
		return false;
	}
}
?>